home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 4 / United Public Domain Gold 4.iso / fredfish / ff.0249.dms / ff.0249.adf / Automata / AutomaTron.c < prev    next >
Text File  |  1989-09-14  |  36KB  |  1,190 lines

  1. /*
  2.       AutomaTron.c         Gary Teachout     August  1989
  3.  
  4.       lc -L AutomaTron     To compile and link with Lattice 5.0
  5. */
  6.  
  7.  #include <intuition/intuition.h>
  8.  
  9.  #define FPEN        7
  10.  #define DPEN        7
  11.  #define BPEN        0
  12.  
  13.  #define CMAX        8
  14.  #define SWIDTH      320
  15.  #define SHEIGHT     200
  16.  #define PLANES      3
  17.  
  18.  #define RULEMAX     ( 7 * 7 ) + 1
  19.  #define SEEDMAX     80
  20.  
  21.  #define STOPMODE    1 
  22.  #define RULEMODE    2 
  23.  #define SEEDMODE    4 
  24.  
  25.  struct menubox
  26.  {
  27.    struct MenuItem      item  ;
  28.    struct IntuiText     text  ;
  29.  }  ;
  30.  
  31.  struct IntuitionBase      *IntuitionBase  ;
  32.  struct GfxBase            *GfxBase  ;
  33.  
  34.  struct Screen             *screen  ;
  35.  struct Window             *window  ;
  36.  struct IntuiMessage       *mes  ;
  37.  
  38.  ULONG   class  ;
  39.  USHORT  code  ;
  40.  
  41.  struct NewScreen   ns =
  42.  {
  43.    0 , 0 , SWIDTH , SHEIGHT , PLANES , DPEN , BPEN , 0 ,
  44.    CUSTOMSCREEN , NULL , "  AutomaTron" , NULL , NULL
  45.  }  ;
  46.  
  47.  struct TextAttr     stext = { "topaz.font" , 8 , 0 , 0 }  ;
  48.  
  49.  struct NewWindow   
  50.    nw =                 /* for display window */
  51.    {
  52.       0 , 0 , SWIDTH , SHEIGHT , DPEN , BPEN ,
  53.       MENUPICK | MENUVERIFY ,
  54.       SMART_REFRESH | ACTIVATE | BACKDROP | BORDERLESS ,
  55.       NULL , NULL , NULL , 
  56.       NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  57.    } ,
  58.    rnw =                /* for string request window */
  59.    {
  60.       0 , 30 , 320 , 38 , DPEN , 3 ,
  61.       GADGETUP ,
  62.       SMART_REFRESH | ACTIVATE | WINDOWDRAG ,
  63.       NULL , NULL , NULL , 
  64.       NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  65.    }  ;
  66.  
  67. /* string request gadgets and stuff */
  68.  struct Gadget    rgadget[ 3 ] =
  69.  {
  70.    {  NULL , 4 , 13 , 312 , 8 ,
  71.       GADGHCOMP , TOGGLESELECT | RELVERIFY | STRINGCENTER , STRGADGET , 
  72.       NULL , NULL , NULL , 0 , NULL , 1 , NULL } ,
  73.    {  NULL , 8 , 25 , 100 , 10 ,
  74.       GADGHCOMP , RELVERIFY , BOOLGADGET , 
  75.       NULL , NULL , NULL , 0 , NULL , 2 , NULL } ,
  76.    {  NULL , 212 , 25 , 100 , 10 ,
  77.       GADGHCOMP , RELVERIFY , BOOLGADGET , 
  78.       NULL , NULL , NULL , 0 , NULL , 3 , NULL }
  79.  }  ;
  80.  
  81.  struct StringInfo   reqinfo  ;
  82.  
  83.  UBYTE   buff[ SEEDMAX + 1 ] ,
  84.          ubuff[ SEEDMAX + 1 ]  ;
  85.  
  86.  struct Border    borders[ 3 ] =
  87.  {
  88.    {  -2 , -2 , 4 , 0 , JAM1 , 5 } ,
  89.    {  -1 , -1 , 2 , 0 , JAM1 , 5 } ,
  90.    {  -1 , -1 , 1 , 0 , JAM1 , 5 } ,
  91.  }  ;
  92.  
  93.  short   xyborders[ 2 ][ 10 ] =
  94.  {
  95.    {  0 , 0 , 315 , 0 , 315 , 11 , 0 , 11 , 0 , 0  } ,
  96.    {  0 , 0 , 101 , 0 , 101 , 11 , 0 , 11 , 0 , 0  } ,
  97.  } ;
  98.  
  99.  struct IntuiText    gtext[ 2 ] =
  100.  {
  101.    {  FPEN , BPEN , JAM1 , 42 , 2 , NULL , "OK" , NULL  } ,
  102.    {  FPEN , BPEN , JAM1 , 26 , 2 , NULL , "CANCEL" , NULL  }
  103.  }  ;
  104.  
  105. /* display window menus */
  106.  struct Menu      menulist[ 3 ] =
  107.  {
  108.    {  NULL , 1   , 0 , 90 , 8  , MENUENABLED , " Control" , NULL } ,
  109.    {  NULL , 91  , 0 , 90 , 10 , MENUENABLED , " Rules" , NULL } ,
  110.    {  NULL , 181 , 0 , 90 , 10 , MENUENABLED , " Seeds" , NULL } 
  111.  }  ;
  112.  
  113.  struct menubox 
  114.    controlmenu[ 6 ] =
  115.    {
  116.       {
  117.          {  NULL , 0 , 0  , 140 , 11 , 
  118.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  119.             0 , NULL , NULL , 'S' , NULL , NULL } ,
  120.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Stop" , NULL } 
  121.       } ,
  122.       {
  123.          {  NULL , 0 , 11 , 140 , 11 , 
  124.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  125.             0 , NULL , NULL , 'C' , NULL , NULL } ,
  126.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Continue" , NULL } 
  127.       } ,
  128.       {
  129.          {  NULL , 0 , 22 , 140 , 11 , 
  130.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  131.             0 , NULL , NULL , 0 , NULL , NULL } ,
  132.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Precision" , NULL } 
  133.       } ,
  134.       {
  135.          {  NULL , 0 , 33 , 140 , 11 , 
  136.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  137.             0 , NULL , NULL , 0 , NULL , NULL } ,
  138.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Neighborhood" , NULL } 
  139.       } ,
  140.       {
  141.          {  NULL , 0 , 44 , 140 , 11 , 
  142.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  143.             0 , NULL , NULL , 0 , NULL , NULL } ,
  144.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Modes" , NULL } 
  145.       } ,
  146.       {
  147.          {  NULL , 0 , 66 , 140 , 11 , 
  148.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  149.             0 , NULL , NULL , 'Q' , NULL , NULL } ,
  150.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Quit" , NULL } 
  151.       } 
  152.    } ,
  153.    rulesmenu[ 2 ] =
  154.    {
  155.       {
  156.          {  NULL , 0 , 0  , 110 , 11 , 
  157.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  158.             0 , NULL , NULL , 'R' , NULL , NULL } ,
  159.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Random" , NULL } 
  160.       } ,
  161.       {
  162.          {  NULL , 0 , 11 , 110 , 11 , 
  163.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  164.             0 , NULL , NULL , 0 , NULL , NULL } ,
  165.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Custom" , NULL } 
  166.       }
  167.    } ,
  168.    seedsmenu[ 3 ] =
  169.    {
  170.       {
  171.          {  NULL , 0 , 0  , 120 , 11 , 
  172.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  173.             0 , NULL , NULL , 'P' , NULL , NULL } ,
  174.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Random" , NULL } 
  175.       } ,
  176.       {
  177.          {  NULL , 0 , 11 , 120 , 11 , 
  178.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  179.             0 , NULL , NULL , 0 , NULL , NULL } ,
  180.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Custom" , NULL } 
  181.       } ,
  182.       {
  183.          {  NULL , 0 , 22 , 120 , 11 , 
  184.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  185.             0 , NULL , NULL , 'O' , NULL , NULL } ,
  186.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Old Seed" , NULL } 
  187.       }
  188.    } ,
  189.    precisionsub[ 3 ] =
  190.    {
  191.       {
  192.          {  NULL , 130 , 0  , 120 , 11 , 
  193.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  194.             0 , NULL , NULL , 0 , NULL , NULL } ,
  195.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "160 Cells" , NULL } 
  196.       } ,
  197.       {
  198.          {  NULL , 130 , 11 , 120 , 11 , 
  199.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | CHECKED ,
  200.             0 , NULL , NULL , 0 , NULL , NULL } ,
  201.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "320 Cells" , NULL } 
  202.       } ,
  203.       {
  204.          {  NULL , 130 , 22 , 120 , 11 , 
  205.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  206.             0 , NULL , NULL , 0 , NULL , NULL } ,
  207.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "640 Cells" , NULL } 
  208.       }
  209.    } ,
  210.    neighborsub[ 6 ] =
  211.    {
  212.       {
  213.          {  NULL , 130 , 0  , 120 , 11 , 
  214.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  215.             0x3e , NULL , NULL , 0 , NULL , NULL } ,
  216.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "2 Cells" , NULL } 
  217.       } ,
  218.       {
  219.          {  NULL , 130 , 11 , 120 , 11 , 
  220.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | CHECKED ,
  221.             0x3d , NULL , NULL , 0 , NULL , NULL } ,
  222.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "3 Cells" , NULL } 
  223.       } ,
  224.       {
  225.          {  NULL , 130 , 22 , 120 , 11 , 
  226.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  227.             0x3b , NULL , NULL , 0 , NULL , NULL } ,
  228.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "4 Cells" , NULL } 
  229.       } ,
  230.       {
  231.          {  NULL , 130 , 33 , 120 , 11 , 
  232.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  233.             0x37 , NULL , NULL , 0 , NULL , NULL } ,
  234.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "5 Cells" , NULL } 
  235.       } ,
  236.       {
  237.          {  NULL , 130 , 44 , 120 , 11 , 
  238.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  239.             0x2f , NULL , NULL , 0 , NULL , NULL } ,
  240.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "6 Cells" , NULL } 
  241.       } ,
  242.       {
  243.          {  NULL , 130 , 55 , 120 , 11 , 
  244.             ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT ,
  245.             0x1f , NULL , NULL , 0 , NULL , NULL } ,
  246.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "7 Cells" , NULL } 
  247.       }
  248.    } ,
  249.    modesub[ 3 ] =
  250.    {
  251.       {
  252.          {  NULL , 130 , 0  , 120 , 11 , 
  253.             ITEMTEXT | ITEMENABLED | HIGHCOMP | MENUTOGGLE | CHECKIT ,
  254.             0 , NULL , NULL , 0 , NULL , NULL } ,
  255.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Stop" , NULL } 
  256.       } ,
  257.       {
  258.          {  NULL , 130 , 11 , 120 , 11 , 
  259.             ITEMTEXT | ITEMENABLED | HIGHCOMP
  260.             | MENUTOGGLE | CHECKIT | CHECKED ,
  261.             0 , NULL , NULL , 0 , NULL , NULL } ,
  262.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "New Seed" , NULL } 
  263.       } ,
  264.       {
  265.          {  NULL , 130 , 22 , 120 , 11 , 
  266.             ITEMTEXT | ITEMENABLED | HIGHCOMP
  267.             | MENUTOGGLE | CHECKIT | CHECKED ,
  268.             0 , NULL , NULL , 0 , NULL , NULL } ,
  269.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "New Rule" , NULL } 
  270.       }
  271.    }  ;
  272.  
  273. /* assorted global variables */
  274.  USHORT  line ,                  /* display y */
  275.          stopflag = 0 ,
  276.          neighborhood = 3 ,
  277.          precision = SWIDTH ,
  278.          modes = SEEDMODE | RULEMODE  ;
  279.  
  280.  UBYTE   colors = 4 ,
  281.          cells1[ 640 ] ,         /* cell array 1 */
  282.          cells2[ 640 ] ,         /* cell array 2 */
  283.          *old ,                  /* pointer to old cells */
  284.          *new ,                  /* pointer to new cells */
  285.          oldseed[ SEEDMAX + 1 ] = { 1 , 255 } ,
  286.          rule[ RULEMAX ] = { 0 , 1 , 3 , 1 , 1 , 2 , 3 , 0 , 0 }  ;
  287.  
  288.  UBYTE   ctab[ CMAX ][ 3 ] =     /* screen colors */
  289.  {
  290.    { 0 , 0 , 0 } ,
  291.    { 15 , 0 , 0 } ,
  292.    { 0 , 15 , 0 } ,
  293.    { 0 , 0 , 15 } ,
  294.  
  295.    { 14 , 14 , 0 } ,
  296.    { 14 , 0 , 14 } ,
  297.    { 0 , 14 , 14 } ,
  298.    { 14 , 14 , 14 } 
  299.  }  ;
  300.  
  301.  
  302.  char                   *AllocMem()  ;
  303.  struct Screen          *OpenScreen()  ;
  304.  struct Window          *OpenWindow()  ;
  305.  struct IntuiMessage    *GetMsg()  ;
  306.  
  307.  void    cleanup( void )  ;
  308.  void    stepauto( void )  ;
  309.  void    display( void )  ;
  310.  UBYTE   random( UBYTE )  ;
  311.  void    randrule( void )  ;
  312.  void    randseed( void )  ;
  313.  void    handlemsg( void )  ;
  314.  void    handlemenu( void )  ;
  315.  void    stoploop( void )  ;
  316.  short   stringreq( UBYTE * , short )  ;
  317.  
  318.  
  319.  void main()
  320.  {
  321.    short    i  ;
  322.  
  323.    IntuitionBase = ( struct IntuitionBase * )
  324.                    OpenLibrary( "intuition.library" , 33 )  ;
  325.    if ( ! IntuitionBase )
  326.       cleanup()  ;
  327.  
  328.    GfxBase = ( struct GfxBase * )
  329.              OpenLibrary( "graphics.library" , 33 )  ;
  330.    if ( ! GfxBase )
  331.       cleanup()  ;
  332.  
  333.    ns.Font = &stext  ;
  334.    screen = OpenScreen( &ns )  ;
  335.    if ( ! screen )
  336.       cleanup()  ;
  337.  
  338.    for ( i = 0 ; i < CMAX ; i ++ )
  339.       SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  340.                                        ctab[ i ][ 1 ] ,
  341.                                        ctab[ i ][ 2 ] )  ;
  342.  
  343.    rgadget[ 0 ].NextGadget = &rgadget[ 1 ]  ;
  344.    rgadget[ 1 ].NextGadget = &rgadget[ 2 ]  ;
  345.    rgadget[ 0 ].SpecialInfo = ( APTR ) &reqinfo  ;
  346.    reqinfo.Buffer = buff  ;
  347.    reqinfo.UndoBuffer = ubuff  ;
  348.    rgadget[ 0 ].GadgetRender = ( APTR ) &borders[ 0 ]  ;
  349.    rgadget[ 1 ].GadgetRender = ( APTR ) &borders[ 1 ]  ;
  350.    rgadget[ 2 ].GadgetRender = ( APTR ) &borders[ 2 ]  ;
  351.    borders[ 0 ].XY = &xyborders[ 0 ][ 0 ]  ;
  352.    borders[ 1 ].XY = &xyborders[ 1 ][ 0 ]  ;
  353.    borders[ 2 ].XY = &xyborders[ 1 ][ 0 ]  ;
  354.    rgadget[ 1 ].GadgetText = >ext[ 0 ]  ;
  355.    rgadget[ 2 ].GadgetText = >ext[ 1 ]  ;
  356.    rnw.FirstGadget = &rgadget[ 0 ]  ;
  357.  
  358.    nw.Screen = screen  ;
  359.    window = OpenWindow( &nw )  ;
  360.    if ( ! window )
  361.       cleanup()  ;
  362.  
  363.    SetAPen( window->RPort , 7 )  ;
  364.    Move( window->RPort , 10 , 140 )  ;
  365.    Text( window->RPort , "One Dimensional Cellular Automation" , 35 )  ;
  366.    Move( window->RPort , 10 , 152 )  ;
  367.    Text( window->RPort , "by  Gary Teachout" , 17 )  ;
  368.  
  369.    menulist[ 0 ].NextMenu = &menulist[ 1 ]  ;
  370.    menulist[ 0 ].FirstItem = &controlmenu[ 0 ].item  ;
  371.    menulist[ 1 ].NextMenu = &menulist[ 2 ]  ;
  372.    menulist[ 1 ].FirstItem = &rulesmenu[ 0 ].item  ;
  373.    menulist[ 2 ].FirstItem = &seedsmenu[ 0 ].item  ;
  374.  
  375.    controlmenu[ 0 ].item.ItemFill = ( APTR ) &controlmenu[ 0 ].text  ;
  376.    controlmenu[ 0 ].item.NextItem = &controlmenu[ 1 ].item  ;
  377.    controlmenu[ 1 ].item.ItemFill = ( APTR ) &controlmenu[ 1 ].text  ;
  378.    controlmenu[ 1 ].item.NextItem = &controlmenu[ 2 ].item  ;
  379.    controlmenu[ 2 ].item.ItemFill = ( APTR ) &controlmenu[ 2 ].text  ;
  380.    controlmenu[ 2 ].item.NextItem = &controlmenu[ 3 ].item  ;
  381.    controlmenu[ 3 ].item.ItemFill = ( APTR ) &controlmenu[ 3 ].text  ;
  382.    controlmenu[ 3 ].item.NextItem = &controlmenu[ 4 ].item  ;
  383.    controlmenu[ 4 ].item.ItemFill = ( APTR ) &controlmenu[ 4 ].text  ;
  384.    controlmenu[ 4 ].item.NextItem = &controlmenu[ 5 ].item  ;
  385.    controlmenu[ 5 ].item.ItemFill = ( APTR ) &controlmenu[ 5 ].text  ;
  386.  
  387.    controlmenu[ 2 ].item.SubItem = &precisionsub[ 0 ].item  ;
  388.       precisionsub[ 0 ].item.ItemFill = ( APTR ) &precisionsub[ 0 ].text  ;
  389.       precisionsub[ 0 ].item.NextItem = &precisionsub[ 1 ].item  ;
  390.       precisionsub[ 1 ].item.ItemFill = ( APTR ) &precisionsub[ 1 ].text  ;
  391.       precisionsub[ 1 ].item.NextItem = &precisionsub[ 2 ].item  ;
  392.       precisionsub[ 2 ].item.ItemFill = ( APTR ) &precisionsub[ 2 ].text  ;
  393.  
  394.    controlmenu[ 3 ].item.SubItem = &neighborsub[ 0 ].item  ;
  395.       neighborsub[ 0 ].item.ItemFill = ( APTR ) &neighborsub[ 0 ].text  ;
  396.       neighborsub[ 0 ].item.NextItem = &neighborsub[ 1 ].item  ;
  397.       neighborsub[ 1 ].item.ItemFill = ( APTR ) &neighborsub[ 1 ].text  ;
  398.       neighborsub[ 1 ].item.NextItem = &neighborsub[ 2 ].item  ;
  399.       neighborsub[ 2 ].item.ItemFill = ( APTR ) &neighborsub[ 2 ].text  ;
  400.       neighborsub[ 2 ].item.NextItem = &neighborsub[ 3 ].item  ;
  401.       neighborsub[ 3 ].item.ItemFill = ( APTR ) &neighborsub[ 3 ].text  ;
  402.       neighborsub[ 3 ].item.NextItem = &neighborsub[ 4 ].item  ;
  403.       neighborsub[ 4 ].item.ItemFill = ( APTR ) &neighborsub[ 4 ].text  ;
  404.       neighborsub[ 4 ].item.NextItem = &neighborsub[ 5 ].item  ;
  405.       neighborsub[ 5 ].item.ItemFill = ( APTR ) &neighborsub[ 5 ].text  ;
  406.  
  407.    controlmenu[ 4 ].item.SubItem = &modesub[ 0 ].item  ;
  408.       modesub[ 0 ].item.ItemFill = ( APTR ) &modesub[ 0 ].text  ;
  409.       modesub[ 0 ].item.NextItem = &modesub[ 1 ].item  ;
  410.       modesub[ 1 ].item.ItemFill = ( APTR ) &modesub[ 1 ].text  ;
  411.       modesub[ 1 ].item.NextItem = &modesub[ 2 ].item  ;
  412.       modesub[ 2 ].item.ItemFill = ( APTR ) &modesub[ 2 ].text  ;
  413.  
  414.    rulesmenu[ 0 ].item.ItemFill = ( APTR ) &rulesmenu[ 0 ].text  ;
  415.    rulesmenu[ 0 ].item.NextItem = &rulesmenu[ 1 ].item  ;
  416.    rulesmenu[ 1 ].item.ItemFill = ( APTR ) &rulesmenu[ 1 ].text  ;
  417.  
  418.    seedsmenu[ 0 ].item.ItemFill = ( APTR ) &seedsmenu[ 0 ].text  ;
  419.    seedsmenu[ 0 ].item.NextItem = &seedsmenu[ 1 ].item  ;
  420.    seedsmenu[ 1 ].item.ItemFill = ( APTR ) &seedsmenu[ 1 ].text  ;
  421.    seedsmenu[ 1 ].item.NextItem = &seedsmenu[ 2 ].item  ;
  422.    seedsmenu[ 2 ].item.ItemFill = ( APTR ) &seedsmenu[ 2 ].text  ;
  423.  
  424.    SetMenuStrip( window , menulist ) ;
  425.  
  426.    ShowTitle( screen , TRUE )  ;
  427.  
  428.    old = cells1  ;
  429.    new = cells2  ;
  430.  
  431.    randseed()  ;
  432.  
  433.    for ( ; ; )                   /* loop for each line */
  434.    {
  435.       stepauto()  ;
  436.  
  437.       display()  ;
  438.  
  439.       if ( old == cells2 )
  440.       {
  441.          old = cells1  ;
  442.          new = cells2  ;
  443.       }
  444.       else
  445.       {
  446.          old = cells2  ;
  447.          new = cells1  ;
  448.       }
  449.  
  450.       if ( line == 12 )      
  451.       {
  452.          if ( modes & STOPMODE )
  453.             stoploop()  ;
  454.          if ( ( modes & RULEMODE ) && ( line == 12 ) )
  455.             randrule()  ;
  456.          if ( ( modes & SEEDMODE ) && ( line == 12 ) )
  457.             randseed()  ;
  458.       }
  459.  
  460.       handlemsg()  ;
  461.    }
  462.  }
  463.  
  464.  
  465.  void cleanup()  
  466.  {
  467.    if ( window )
  468.    {
  469.       ClearMenuStrip( window )  ;
  470.       CloseWindow( window )  ;
  471.    }
  472.  
  473.    if ( screen )
  474.       CloseScreen( screen )  ;
  475.  
  476.    if ( GfxBase )
  477.       CloseLibrary( GfxBase )  ;
  478.  
  479.    if ( IntuitionBase )
  480.       CloseLibrary( IntuitionBase )  ;
  481.  
  482.    exit()  ;
  483.  }
  484.  
  485.  
  486.  void stepauto()     /* this is the actual line automation step */
  487.  {
  488.    short    x , t  ;
  489.    UBYTE    *n , *or , *ol , *oc  ;
  490.  
  491.    n = new  ;
  492.  
  493.    switch ( neighborhood )
  494.    {
  495.    case 2 :
  496.       ol = old + precision - 1  ;
  497.       or = old + 1  ;
  498.       *( n ++ ) = rule[ *( or ++ ) + *ol ]  ; 
  499.       ol = old  ;
  500.       for ( x = 2 ; x < precision ; x ++ )
  501.          *( n ++ ) = rule[ *( or ++ ) + *( ol ++ ) ]  ; 
  502.       or = old  ;
  503.       *n = rule[ *or + *ol ]  ; 
  504.       break  ;
  505.    case 3 :
  506.       t = *( old + precision - 1 ) + *( old + 1 ) + *old  ;
  507.       *( n ++ ) = rule[ t ]  ; 
  508.       or = old + 2  ;
  509.       ol = old + precision - 1  ;
  510.       t = t - *ol + *( or ++ )  ;
  511.       *( n ++ ) = rule[ t ]  ; 
  512.       ol = old  ;
  513.       for ( x = 3 ; x < precision ; x ++ )
  514.       {
  515.          t = t - *( ol ++ ) + *( or ++ )  ;
  516.          *( n ++ ) = rule[ t ]  ; 
  517.       }
  518.       or = old  ;
  519.       t = t - *ol + *or  ;
  520.       *n = rule[ t ]  ; 
  521.       break  ;
  522.    case 4 :
  523.       oc = old  ;
  524.       t =      *( old + precision - 1 )
  525.             +  *( old + precision - 2 )
  526.             +  *( old + 2 )
  527.             +  *( old + 1 )
  528.             +  *old  ;
  529.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  530.       or = old + 3  ;
  531.       ol = old + precision - 2  ;
  532.       t = t - *( ol ++ ) + *( or ++ )  ;
  533.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  534.       t = t - *ol + *( or ++ )  ;
  535.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  536.       ol = old  ;
  537.       for ( x = 5 ; x < precision ; x ++ )
  538.       {
  539.          t = t - *( ol ++ ) + *( or ++ )  ;
  540.          *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  541.       }
  542.       or = old  ;
  543.       t = t - *( ol ++ ) + *( or ++ )  ;
  544.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  545.       t = t - *ol + *or  ;
  546.       *n = rule[ t - *oc ]  ; 
  547.  
  548.       break  ;
  549.    case 5 :
  550.       t =      *( old + precision - 1 )
  551.             +  *( old + precision - 2 )
  552.             +  *( old + 2 )
  553.             +  *( old + 1 )
  554.             +  *old  ;
  555.       *( n ++ ) = rule[ t ]  ; 
  556.       or = old + 3  ;
  557.       ol = old + precision - 2  ;
  558.       t = t - *( ol ++ ) + *( or ++ )  ;
  559.       *( n ++ ) = rule[ t ]  ; 
  560.       t = t - *ol + *( or ++ )  ;
  561.       *( n ++ ) = rule[ t ]  ; 
  562.       ol = old  ;
  563.       for ( x = 5 ; x < precision ; x ++ )
  564.       {
  565.          t = t - *( ol ++ ) + *( or ++ )  ;
  566.          *( n ++ ) = rule[ t ]  ; 
  567.       }
  568.       or = old  ;
  569.       t = t - *( ol ++ ) + *( or ++ )  ;
  570.       *( n ++ ) = rule[ t ]  ; 
  571.       t = t - *ol + *or  ;
  572.       *n = rule[ t ]  ; 
  573.       break  ;
  574.    case 6 :
  575.       oc = old  ;
  576.       t =      *( old + precision - 1 )
  577.             +  *( old + precision - 2 )
  578.             +  *( old + precision - 3 )
  579.             +  *( old + 3 )
  580.             +  *( old + 2 )
  581.             +  *( old + 1 )
  582.             +  *( old )  ;
  583.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  584.       or = old + 4  ;
  585.       ol = old + precision - 3  ;
  586.       t = t - *( ol ++ ) + *( or ++ )  ;
  587.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  588.       t = t - *( ol ++ ) + *( or ++ )  ;
  589.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  590.       t = t - *ol + *( or ++ )  ;
  591.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  592.       ol = old  ;
  593.       for ( x = 7 ; x < precision ; x ++ )
  594.       {
  595.          t = t - *( ol ++ ) + *( or ++ )  ;
  596.          *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  597.       }
  598.       or = old  ;
  599.       t = t - *( ol ++ ) + *( or ++ )  ;
  600.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  601.       t = t - *( ol ++ ) + *( or ++ )  ;
  602.       *( n ++ ) = rule[ t - *( oc ++ ) ]  ; 
  603.       t = t - *ol + *or  ;
  604.       *n = rule[ t - *oc ]  ; 
  605.       break  ;
  606.    case 7 :
  607.       t =      *( old + precision - 1 )
  608.             +  *( old + precision - 2 )
  609.             +  *( old + precision - 3 )
  610.             +  *( old + 3 )
  611.             +  *( old + 2 )
  612.             +  *( old + 1 )
  613.             +  *( old )  ;
  614.       *( n ++ ) = rule[ t ]  ; 
  615.       or = old + 4  ;
  616.       ol = old + precision - 3  ;
  617.       t = t - *( ol ++ ) + *( or ++ )  ;
  618.       *( n ++ ) = rule[ t ]  ; 
  619.       t = t - *( ol ++ ) + *( or ++ )  ;
  620.       *( n ++ ) = rule[ t ]  ; 
  621.       t = t - *ol + *( or ++ )  ;
  622.       *( n ++ ) = rule[ t ]  ; 
  623.       ol = old  ;
  624.       for ( x = 7 ; x < precision ; x ++ )
  625.       {
  626.          t = t - *( ol ++ ) + *( or ++ )  ;
  627.          *( n ++ ) = rule[ t ]  ; 
  628.       }
  629.       or = old  ;
  630.       t = t - *( ol ++ ) + *( or ++ )  ;
  631.       *( n ++ ) = rule[ t ]  ; 
  632.       t = t - *( ol ++ ) + *( or ++ )  ;
  633.       *( n ++ ) = rule[ t ]  ; 
  634.       t = t - *ol + *or  ;
  635.       *n = rule[ t ]  ; 
  636.       break  ;
  637.    }
  638.  }
  639.  
  640.  
  641.  void display()      /* render cells directly to screens bit map */
  642.  {
  643.    USHORT   d , i , j , k , m , *wp[ PLANES ] , *wpc[ PLANES ]  ;
  644.    UBYTE    cm , *c ;
  645.  
  646.    if ( precision == 160 )
  647.    {
  648.       i = ( line * screen->BitMap.BytesPerRow )  ;
  649.       wp[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  650.       wp[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  651.       wp[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  652.       i = ( ( line + 1 ) * screen->BitMap.BytesPerRow )  ;
  653.       wpc[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  654.       wpc[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  655.       wpc[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  656.       c = new  ;
  657.  
  658.       for ( i = 0 ; i < precision ; i += 8 )
  659.       {
  660.          for ( cm = 1 , j = 0 ; j < PLANES ; j ++ , cm = cm << 1 )
  661.          {
  662.             d = 0  ;
  663.             for ( m = 0xc000 , k = 0 ; k < 8 ; m = m >> 2 , k ++ )
  664.             {
  665.                if ( *( c + k ) & cm )
  666.                   d |= m  ;
  667.             }
  668.             *wp[ j ] = d  ;
  669.             wp[ j ] ++  ;
  670.             *wpc[ j ] = d  ;
  671.             wpc[ j ] ++  ;
  672.          }
  673.          c += 8  ;
  674.       }
  675.  
  676.       line += 2  ;
  677.       if ( line >= window->Height )
  678.          line = 12  ;
  679.       else
  680.       {
  681.          i = ( line * screen->BitMap.BytesPerRow )  ;
  682.          wp[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  683.          wp[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  684.          wp[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  685.          i = ( ( line + 1 ) * screen->BitMap.BytesPerRow )  ;
  686.          wpc[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  687.          wpc[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  688.          wpc[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  689.  
  690.          for ( i = 0 ; i < precision ; i += 8 )
  691.          {
  692.             for ( j = 0 ; j < PLANES ; j ++ )
  693.             {
  694.                *wp[ j ] = 0  ;
  695.                wp[ j ] ++  ;
  696.                *wpc[ j ] = 0  ;
  697.                wpc[ j ] ++  ;
  698.             }
  699.          }
  700.       }
  701.    }
  702.    else
  703.    {
  704.       i = ( line * screen->BitMap.BytesPerRow )  ;
  705.       wp[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  706.       wp[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  707.       wp[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  708.       c = new  ;
  709.  
  710.       for ( i = 0 ; i < precision ; i += 16 )
  711.       {
  712.          for ( cm = 1 , j = 0 ; j < PLANES ; j ++ , cm = cm << 1 )
  713.          {
  714.             d = 0  ;
  715.             for ( m = 0x8000 , k = 0 ; k < 16 ; m = m >> 1 , k ++ )
  716.             {
  717.                if ( *( c + k ) & cm )
  718.                   d |= m  ;
  719.             }
  720.             *wp[ j ] = d  ;
  721.             wp[ j ] ++  ;
  722.          }
  723.          c += 16  ;
  724.       }
  725.  
  726.       line ++  ;
  727.       if ( line == window->Height )
  728.          line = 12  ;
  729.       else
  730.       {
  731.          i = ( line * screen->BitMap.BytesPerRow )  ;
  732.          wp[ 0 ] = ( USHORT * ) ( screen->BitMap.Planes[ 0 ] + i )  ;
  733.          wp[ 1 ] = ( USHORT * ) ( screen->BitMap.Planes[ 1 ] + i )  ;
  734.          wp[ 2 ] = ( USHORT * ) ( screen->BitMap.Planes[ 2 ] + i )  ;
  735.  
  736.          for ( i = 0 ; i < precision ; i += 16 )
  737.          {
  738.             for ( j = 0 ; j < PLANES ; j ++ )
  739.             {
  740.                *wp[ j ] = 0  ;
  741.                wp[ j ] ++  ;
  742.             }
  743.          }
  744.       }
  745.    }
  746.  }
  747.  
  748.  
  749.  UBYTE random( a )
  750.    UBYTE    a  ;
  751.  {
  752.    #define RANDSHIFT      8
  753.    #define RANDTAB        23
  754.    #define RANDCOMP       8388608
  755.    static UBYTE   fp = 1  ;
  756.    static long    v[ RANDTAB ] , rr ;
  757.    short          vi  ;
  758.  
  759.    if ( fp )
  760.    {
  761.       CurrentTime( &v[ 0 ] , &v[ 1 ] )  ;
  762.       srand( v[ 1 ] )  ;
  763.       for ( vi = 0 ; vi < RANDTAB ; vi ++ )
  764.          v[ vi ] = rand() >> RANDSHIFT  ;
  765.       rr = rand() >> RANDSHIFT  ;
  766.       fp = 0  ;
  767.    }
  768.  
  769.    vi = RANDTAB * rr / RANDCOMP  ;
  770.    rr = v[ vi ]  ;
  771.    v[ vi ] = rand() >> RANDSHIFT  ;
  772.  
  773.    return ( UBYTE ) ( ( a * rr ) / RANDCOMP )  ;
  774.  }
  775.  
  776.  
  777.  void randrule()
  778.  {
  779.    short    i , s  ;
  780.    UBYTE    c  ;
  781.  
  782.  
  783.    if ( random( 2 ) )
  784.       c = 2 + random( 6 )  ;          /* 2 - 7  colors */
  785.    else
  786.       c = 3 + random( 3 )  ;          /* 3 - 5  colors */
  787.    s = ( ( c - 1 ) * neighborhood ) + 1  ;
  788.    do
  789.    {
  790.       for ( i = 0 ; i < s ; i ++ )
  791.          rule[ i ] = random( c )  ;
  792.       for ( ; i < RULEMAX ; i ++ )
  793.          rule[ i ] = 0  ;
  794.       if ( random( 2 ) )
  795.          rule[ 0 ] = 0  ;
  796.       for ( colors = 0 , i = 0 ; i < RULEMAX ; i ++ )
  797.          if ( rule[ i ] >= colors )
  798.             colors = rule[ i ] + 1  ;
  799.    } while ( colors <= 1 )  ;
  800.  }
  801.  
  802.  
  803.  void randseed()
  804.  {
  805.    short    x   ;
  806.  
  807.    line = 12  ;
  808.    for ( x = 0 ; x < precision ; x ++ )
  809.       *( new + x ) = random( colors )  ;
  810.  
  811.    display()  ;
  812.  
  813.    if ( old == cells2 )
  814.    {
  815.       old = cells1  ;
  816.       new = cells2  ;
  817.    }
  818.    else
  819.    {
  820.       old = cells2  ;
  821.       new = cells1  ;
  822.    }
  823.  }
  824.  
  825.  
  826.  void handlemsg()
  827.  {
  828.    while ( mes = GetMsg( window->UserPort ) )
  829.    {
  830.       class = mes->Class  ;
  831.       code = mes->Code  ;
  832.       ReplyMsg( mes )  ;
  833.       switch ( class )
  834.       {
  835.       case MENUVERIFY :
  836.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  837.          while ( class != MENUPICK )
  838.          {
  839.             if ( mes = GetMsg( window->UserPort ) )
  840.             {
  841.                class = mes->Class  ;
  842.                code = mes->Code  ;
  843.                ReplyMsg( mes )  ;
  844.             }
  845.          }
  846.       case MENUPICK :
  847.          handlemenu()  ;
  848.          break  ;
  849.       }
  850.    }
  851.  }
  852.  
  853.  
  854.  void handlemenu()
  855.  {
  856.    short    i , j  ;
  857.  
  858.    switch ( MENUNUM( code ) )
  859.    {
  860.    case 0 : /* control */
  861.       switch ( ITEMNUM( code ) )
  862.       {
  863.       case 0 : /* stop */
  864.          stoploop()  ;
  865.          break  ;
  866.       case 1 : /* continue */
  867.          stopflag = 0  ;
  868.          break  ;
  869.       case 2 : /* precision */
  870.          switch ( SUBNUM( code ) )
  871.          {
  872.          case 0 :
  873.             switch ( precision )
  874.             {
  875.             case 160 :
  876.                break  ;
  877.             case 320 :
  878.                line = 12  ;
  879.                break ;
  880.             case 640 :
  881.                line = 12  ;
  882.                ns.Width = 320  ;
  883.                ns.Height = 200  ;
  884.                ns.ViewModes = 0  ;
  885.                nw.Width = 320  ;
  886.                nw.Height = 200  ;
  887.                ClearMenuStrip( window )  ;
  888.                CloseWindow( window )  ;
  889.                CloseScreen( screen )  ;
  890.                window = NULL  ;
  891.                screen = OpenScreen( &ns )  ;
  892.                if ( screen )
  893.                   window = OpenWindow( &nw )  ;
  894.                if ( window )
  895.                {
  896.                   SetMenuStrip( window , menulist ) ;
  897.                   for ( i = 0 ; i < CMAX ; i ++ )
  898.                      SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  899.                                                       ctab[ i ][ 1 ] ,
  900.                                                       ctab[ i ][ 2 ] )  ;
  901.                }
  902.                else
  903.                {
  904.                   cleanup()  ;
  905.                }
  906.                break  ;
  907.             }
  908.             precision = 160  ;
  909.             precisionsub[ 1 ].item.Flags =      precisionsub[ 1 ].item.Flags
  910.                                              &  ( ~ CHECKED )  ;
  911.             precisionsub[ 2 ].item.Flags =      precisionsub[ 2 ].item.Flags
  912.                                              &  ( ~ CHECKED )  ;
  913.             break  ;
  914.          case 1 :
  915.             switch ( precision )
  916.             {
  917.             case 160 :
  918.                line = 12  ;
  919.                for ( i = 0 ; i < 160 ; i ++ )
  920.                   *( old + 160 + i ) = *( old + i )  ;
  921.                break  ;
  922.             case 320 :
  923.                break ;
  924.             case 640 :
  925.                line = 12  ;
  926.                ns.Width = 320  ;
  927.                ns.Height = 200  ;
  928.                ns.ViewModes = 0  ;
  929.                nw.Width = 320  ;
  930.                nw.Height = 200  ;
  931.                ClearMenuStrip( window )  ;
  932.                CloseWindow( window )  ;
  933.                CloseScreen( screen )  ;
  934.                window = NULL  ;
  935.                screen = OpenScreen( &ns )  ;
  936.                if ( screen )
  937.                   window = OpenWindow( &nw )  ;
  938.                if ( window )
  939.                   SetMenuStrip( window , menulist ) ;
  940.                else
  941.                   cleanup()  ;
  942.                for ( i = 0 ; i < CMAX ; i ++ )
  943.                   SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  944.                                                    ctab[ i ][ 1 ] ,
  945.                                                    ctab[ i ][ 2 ] )  ;
  946.                break  ;
  947.             }
  948.             precision = 320  ;
  949.             precisionsub[ 0 ].item.Flags =      precisionsub[ 0 ].item.Flags
  950.                                              &  ( ~ CHECKED )  ;
  951.             precisionsub[ 2 ].item.Flags =      precisionsub[ 2 ].item.Flags
  952.                                              &  ( ~ CHECKED )  ;
  953.             break  ;
  954.          case 2 :
  955.             switch ( precision )
  956.             {
  957.             case 160 :
  958.                for ( i = 0 ; i < 160 ; i ++ )
  959.                   *( old + 160 + i ) = *( old + i )  ;
  960.             case 320 :
  961.                for ( i = 0 ; i < 320 ; i ++ )
  962.                   *( old + 320 + i ) = *( old + i )  ;
  963.                line = 12  ;
  964.                ns.Width = 640  ;
  965.                ns.Height = 400  ;
  966.                ns.ViewModes = HIRES | LACE  ;
  967.                nw.Width = 640  ;
  968.                nw.Height = 400  ;
  969.                ClearMenuStrip( window )  ;
  970.                CloseWindow( window )  ;
  971.                CloseScreen( screen )  ;
  972.                window = NULL  ;
  973.                screen = OpenScreen( &ns )  ;
  974.                if ( screen )
  975.                   window = OpenWindow( &nw )  ;
  976.                if ( window )
  977.                {
  978.                   for ( i = 0 ; i < CMAX ; i ++ )
  979.                      SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  980.                                                       ctab[ i ][ 1 ] ,
  981.                                                       ctab[ i ][ 2 ] )  ;
  982.                   SetMenuStrip( window , menulist ) ;
  983.                   precision = 640  ;
  984.                   precisionsub[ 0 ].item.Flags =
  985.                            precisionsub[ 0 ].item.Flags & ( ~ CHECKED )  ;
  986.                   precisionsub[ 1 ].item.Flags =
  987.                            precisionsub[ 1 ].item.Flags & ( ~ CHECKED )  ;
  988.                }
  989.                else
  990.                {
  991.                   ns.Width = 320  ;
  992.                   ns.Height = 200  ;
  993.                   ns.ViewModes = 0  ;
  994.                   nw.Width = 320  ;
  995.                   nw.Height = 200  ;
  996.                   if ( screen )
  997.                      CloseScreen( screen )  ;
  998.                   screen = OpenScreen( &ns )  ;
  999.                   if ( screen )
  1000.                      window = OpenWindow( &nw )  ;
  1001.                   if ( window )
  1002.                      SetMenuStrip( window , menulist ) ;
  1003.                   else
  1004.                      cleanup()  ;
  1005.                   for ( i = 0 ; i < CMAX ; i ++ )
  1006.                      SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  1007.                                                       ctab[ i ][ 1 ] ,
  1008.                                                       ctab[ i ][ 2 ] )  ;
  1009.                   SetAPen( window->RPort , 7 )  ;
  1010.                   Move( window->RPort , 10 , 140 )  ;
  1011.                   Text(    window->RPort ,
  1012.                            "Unable to open high res screen" , 30 )  ;
  1013.                   precision = 320  ;
  1014.                   precisionsub[ 0 ].item.Flags =
  1015.                            precisionsub[ 0 ].item.Flags & ( ~ CHECKED )  ;
  1016.                   precisionsub[ 1 ].item.Flags =
  1017.                            precisionsub[ 1 ].item.Flags | CHECKED  ;
  1018.                   precisionsub[ 2 ].item.Flags =
  1019.                            precisionsub[ 2 ].item.Flags & ( ~ CHECKED )  ;
  1020.                }
  1021.                break  ;
  1022.             case 640 :
  1023.                break  ;
  1024.             }
  1025.             break  ;
  1026.          }
  1027.          break  ;
  1028.       case 3 : /* neighborhood */
  1029.          neighborhood = 2 + SUBNUM( code )  ;
  1030.          break  ;
  1031.       case 4 : /* modes */
  1032.          switch ( SUBNUM( code ) )
  1033.          {
  1034.          case 0 :
  1035.             modes = modes ^ STOPMODE  ;
  1036.             break  ;
  1037.          case 1 :
  1038.             modes = modes ^ SEEDMODE  ;
  1039.             break  ;
  1040.          case 2 :
  1041.             modes = modes ^ RULEMODE  ;
  1042.             break  ;
  1043.          }
  1044.          break  ;
  1045.       case 5 : /* quit */
  1046.          cleanup()  ;
  1047.          break  ;
  1048.       }
  1049.       break  ;
  1050.  
  1051.    case 1 : /* rule */
  1052.       switch ( ITEMNUM( code ) )
  1053.       {
  1054.       case 0 :
  1055.          randrule()  ;
  1056.          break  ;
  1057.       case 1 :
  1058.          for ( i = RULEMAX - 1 ; ( i >= 0 ) && ( ! rule[ i ] ) ; i -- )
  1059.             ; 
  1060.          for ( j = 0 ; i >= 0 ; i -- , j ++ )
  1061.             buff[ j ] = rule[ i ] + 48  ;
  1062.          buff[ j ] = 0  ;
  1063.          if ( stringreq( "  Enter New Rule  " , RULEMAX + 1 ) )
  1064.          {
  1065.             for ( i = 0 ; ( i < RULEMAX + 1 ) && ( buff[ i ] ) ; i ++ )
  1066.                ;
  1067.             for ( j = 0 , i -- ; i >= 0 ; i -- , j ++ )
  1068.                rule[ j ] = ( buff[ i ] - 48 ) & 7  ;
  1069.             for ( ; j < RULEMAX ; j ++ )
  1070.                rule[ j ] = 0  ;
  1071.             for ( colors = 0 , i = 0 ; i < RULEMAX ; i ++ )
  1072.                if ( rule[ i ] >= colors )
  1073.                   colors = rule[ i ] + 1  ;
  1074.          }
  1075.          break  ;
  1076.       }
  1077.       break  ;
  1078.  
  1079.    case 2 : /* seed */
  1080.       switch ( ITEMNUM( code ) )
  1081.       {
  1082.       case 0 :
  1083.          randseed()  ;
  1084.          break  ;
  1085.       case 1 :
  1086.          for ( i = 0 ; ( i < SEEDMAX + 1 ) && ( oldseed[ i ] != 255 ) ; i ++ )
  1087.             buff[ i ] = oldseed[ i ] + 48  ;
  1088.          buff[ i ] = 0  ;
  1089.          if ( stringreq( "  Enter New Seed  " , SEEDMAX + 1 ) )
  1090.          {
  1091.             for ( i = 0 ; ( i < SEEDMAX + 1 ) && buff[ i ] ; i ++ )
  1092.                oldseed[ i ] = ( buff[ i ] - 48 ) & 7  ;
  1093.             oldseed[ i ] = 255  ;
  1094.          }
  1095.          else
  1096.             break  ;
  1097.       case 2 :
  1098.          line = 12  ;
  1099.          for ( i = 0 ; i < precision ; i ++ )
  1100.             *( new + i ) = 0  ;
  1101.          j = ( precision >> 1 ) - 10  ;
  1102.          for ( i = 0 ; ( i < SEEDMAX ) && ( oldseed[ i ] != 255 ) ; i ++ )
  1103.             *( new + i + j ) = oldseed[ i ]  ;
  1104.          display()  ;
  1105.          if ( old == cells2 )
  1106.          {
  1107.             old = cells1  ;
  1108.             new = cells2  ;
  1109.          }
  1110.          else
  1111.          {
  1112.             old = cells2  ;
  1113.             new = cells1  ;
  1114.          }
  1115.          break  ;
  1116.       }
  1117.       break  ;
  1118.    }
  1119.  }
  1120.  
  1121.  
  1122.  void stoploop()
  1123.  {
  1124.    if ( ! stopflag )
  1125.    {
  1126.       stopflag = 1  ;
  1127.       while ( stopflag )
  1128.       {
  1129.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  1130.          handlemsg()  ;
  1131.       }
  1132.    }
  1133.  }
  1134.  
  1135.  
  1136.  short stringreq( t , l )
  1137.    UBYTE    *t  ;
  1138.    short    l  ;
  1139.  {
  1140.    struct Window  *rw  ;
  1141.    struct Gadget  *g  ;
  1142.    long           sig  ;
  1143.  
  1144.    rnw.Title = t  ;
  1145.    rnw.Screen = screen  ;
  1146.    reqinfo.BufferPos = 0  ;
  1147.    reqinfo.DispPos = 0  ;
  1148.    reqinfo.MaxChars = l  ;
  1149.  
  1150.    rw = OpenWindow( &rnw )  ; /* a window but it looks like a requester */
  1151.    if ( rw )
  1152.    {
  1153.       sig =       ( 1 << window->UserPort->mp_SigBit )
  1154.                |  ( 1 << rw->UserPort->mp_SigBit )   ;
  1155.  
  1156.       while ( class != GADGETUP )
  1157.       {
  1158.          Wait( sig )  ;
  1159.          while ( mes = GetMsg( window->UserPort ) )
  1160.          {
  1161.             if ( ( mes->Class == MENUVERIFY ) && ( mes->Code == MENUHOT ) )
  1162.                mes->Code = MENUCANCEL  ;
  1163.             ReplyMsg( mes )  ;
  1164.          }
  1165.          while ( mes = GetMsg( rw->UserPort ) )
  1166.          {
  1167.             class = mes->Class  ;
  1168.             g = ( struct Gadget * ) mes->IAddress  ;
  1169.             ReplyMsg( mes )  ;
  1170.          }
  1171.       }
  1172.  
  1173.       CloseWindow( rw )  ;
  1174.  
  1175.       if ( g->GadgetID == 3 )
  1176.          return 0  ;
  1177.       else
  1178.          return 1  ;
  1179.    }
  1180.    else
  1181.    {
  1182.       DisplayBeep( screen )  ;
  1183.       return 0  ;
  1184.    }
  1185.  }
  1186.  
  1187.  
  1188.  
  1189.  
  1190.